// new 的方式创建对象

const _new = function(Fun,...args) {
  //1. 创建一个新对象
  let obj = Object.create(null)

  //2.将对象的__proto__属性指向构造函数的原型
  // 等同于obj.__proto__ = Fun.protoType
  Object.setPrototypeOf(obj, Fun.prototype)

  //3.将对象的this绑定到函数上，并向函数传参
  let res = Fun.apply(obj, args)

  //4.判断函数的返回值类型，如果是值类型，返回创建的对象。如果是引用类型，就返回这个引用类型的对象。
  return res instanceof Object ? res : obj
}

// 示例
function Person(name, age) {
  this.name = name
  this.age = age
}

let person = _new(Person, 'wsn', 23)
console.log(person) // { name: 'wsn', age: 23 }
